﻿using System;

using System.ComponentModel.DataAnnotations;
using log4net;
using Csla;
using Csla.Data;
using System.Collections.Generic;

namespace Sireass.Bl
{
    [Serializable]
    public class AsignacionInfo : ReadOnlyBase<AsignacionInfo>
    {
        // Create a logger for use in this class
        private static readonly ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        #region Propiedades
        public static readonly PropertyInfo<long> IdAsignacionProperty = RegisterProperty<long>(c => c.IdAsignacion);
        [Display(Name = "Id de la Asignacion")]
        public long IdAsignacion
        {
            get { return GetProperty(IdAsignacionProperty); }
            private set { LoadProperty(IdAsignacionProperty, value); }
        }

        public static readonly PropertyInfo<long> IdPrestadorProperty = RegisterProperty<long>(c => c.IdPrestador);
        [Display(Name = "Id del prestador")]
        public long IdPrestador
        {
            get { return GetProperty(IdPrestadorProperty); }
            private set { LoadProperty(IdPrestadorProperty, value); }
        }

        public static readonly PropertyInfo<string> EncargadoProyectoProperty = RegisterProperty<string>(c => c.EncargadoProyecto);
        [Display(Name = "Encargado Proyecto")]
        public string EncargadoProyecto
        {
            get { return GetProperty(EncargadoProyectoProperty); }
            private set { LoadProperty(EncargadoProyectoProperty, value); }
        }

        public static readonly PropertyInfo<long> IdEncargadoProyectoProperty = RegisterProperty<long>(c => c.IdEncargadoProyecto);
        [Display(Name = "Id Encargado Proyecto")]
        public long IdEncargadoProyecto
        {
            get { return GetProperty(IdEncargadoProyectoProperty); }
            private set { LoadProperty(IdEncargadoProyectoProperty, value); }
        }

        public static readonly PropertyInfo<string> PrestadorProperty = RegisterProperty<string>(c => c.Prestador);
        [Display(Name = "Prestador")]
        public string Prestador
        {
            get { return GetProperty(PrestadorProperty); }
            private set { LoadProperty(PrestadorProperty, value); }
        }

        public static readonly PropertyInfo<long> IdProyectoProperty = RegisterProperty<long>(c => c.IdProyecto);
        [Display(Name = "Id del Proyecto")]
        public long IdProyecto
        {
            get { return GetProperty(IdProyectoProperty); }
            private set { LoadProperty(IdProyectoProperty, value); }
        }

        public static readonly PropertyInfo<Int32> IdEstatusProperty = RegisterProperty<Int32>(c => c.IdEstatus);
        [Display(Name = "Id del Estatus")]
        public Int32 IdEstatus
        {
            get { return GetProperty(IdEstatusProperty); }
            private set { LoadProperty(IdEstatusProperty, value); }
        }

        public static readonly PropertyInfo<string> EstatusProperty = RegisterProperty<string>(c => c.Estatus);
        [Display(Name = "Estatus")]
        public string Estatus
        {
            get { return GetProperty(EstatusProperty); }
            private set { LoadProperty(EstatusProperty, value); }
        }

        public static readonly PropertyInfo<DateTime> FechaInicioAsignacionProperty = RegisterProperty<DateTime>(c => c.FechaInicioAsignacion);
        [Display(Name = "Fecha Inicio Asignacion")]
        public DateTime FechaInicioAsignacion
        {
            get { return GetProperty(FechaInicioAsignacionProperty); }
            set { LoadProperty(FechaInicioAsignacionProperty, value); }
        }

        public static readonly PropertyInfo<DateTime> FechaFinAsignacionProperty = RegisterProperty<DateTime>(c => c.FechaFinAsignacion);
        [Display(Name = "Fecha Fin Asignacion")]
        public DateTime FechaFinAsignacion
        {
            get { return GetProperty(FechaFinAsignacionProperty); }
            set { LoadProperty(FechaFinAsignacionProperty, value); }
        }

        public static readonly PropertyInfo<Int16> HorasPorAplicarProperty = RegisterProperty<Int16>(c => c.HorasPorAplicar);
        [Display(Name = "Horas por aplicar")]
        public Int16 HorasPorAplicar
        {
            get { return GetProperty(HorasPorAplicarProperty); }
            set { LoadProperty(HorasPorAplicarProperty, value); }
        } 

        public static readonly PropertyInfo<bool> HabilitadoProperty = RegisterProperty<bool>(c => c.Habilitado);
        [Display(Name = "Habilitado")]
        public bool Habilitado
        {
            get { return GetProperty(HabilitadoProperty); }
            set { LoadProperty(HabilitadoProperty, value); }
        }

        public static readonly PropertyInfo<DateTime> FechaAltaProperty = RegisterProperty<DateTime>(c => c.FechaAlta);
        [Display(Name = "Fecha Alta")]
        public DateTime FechaAlta
        {
            get { return GetProperty(FechaAltaProperty); }
            set { LoadProperty(FechaAltaProperty, value); }
        }

        public static readonly PropertyInfo<DateTime> FechaBajaProperty = RegisterProperty<DateTime>(c => c.FechaBaja);
        [Display(Name = "Fecha Baja")]
        public DateTime FechaBaja
        {
            get { return GetProperty(FechaBajaProperty); }
            set { LoadProperty(FechaBajaProperty, value); }
        }

        public static readonly PropertyInfo<string> EscuelaProperty = RegisterProperty<string>(c => c.Escuela);
        [Display(Name = "Escuela")]
        public string Escuela
        {
            get { return GetProperty(EscuelaProperty); }
            private set { LoadProperty(EscuelaProperty, value); }
        }

        public static readonly PropertyInfo<string> CarreraProperty = RegisterProperty<string>(c => c.Carrera);
        [Display(Name = "Carrera")]
        public string Carrera
        {
            get { return GetProperty(CarreraProperty); }
            private set { LoadProperty(CarreraProperty, value); }
        }

        public static readonly PropertyInfo<string> NumCuentaProperty = RegisterProperty<string>(c => c.NumCuenta);
        [Display(Name = "Numero de Cuenta del Prestador")]
        public string NumCuenta
        {
            get { return GetProperty(NumCuentaProperty); }
            private set { LoadProperty(NumCuentaProperty, value); }
        }

        public static readonly PropertyInfo<string> EstatusPrestadorProperty = RegisterProperty<string>(c => c.EstatusPrestador);
        [Display(Name = "Estatus del Prestador")]
        public string EstatusPrestador
        {
            get { return GetProperty(EstatusPrestadorProperty); }
            private set { LoadProperty(EstatusPrestadorProperty, value); }
        }

        public static readonly PropertyInfo<string> ClaveProyectoProperty = RegisterProperty<string>(c => c.ClaveProyecto);
        [Display(Name = "Clave del Proyecto")]
        public string ClaveProyecto
        {
            get { return GetProperty(ClaveProyectoProperty); }
            private set { LoadProperty(ClaveProyectoProperty, value); }
        }

        public static readonly PropertyInfo<string> NombreProyectoProperty = RegisterProperty<string>(c => c.NombreProyecto);
        [Display(Name = "Nombre del Proyecto")]
        public string NombreProyecto
        {
            get { return GetProperty(NombreProyectoProperty); }
            private set { LoadProperty(NombreProyectoProperty, value); }
        }
        #endregion

		#region Factory
		public static AsignacionInfo GetAsignacionInfo(AsignacionCriteria criteria)
		{
			return DataPortal.Fetch<AsignacionInfo>(criteria);
		}
		#endregion

		#region Métodos
		public static void AddObjectAuthorizationRules()
		{
			Type type = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType;
			PerfilServicioCriteria criteria = new PerfilServicioCriteria(type.FullName, true);
			PerfilServicioList perfilesPorServicio = PerfilServicioList.GetPerfilServicioList(criteria);
			List<string> roles = new List<string>(perfilesPorServicio.Count);
			foreach (PerfilServicioInfo perfilServicio in perfilesPorServicio)
			{
				roles.Add(perfilServicio.Perfil);
			}
			Csla.Rules.BusinessRules.AddRule(type, new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.GetObject, roles));
		}
		#endregion

		#region DataPortal
		private void Child_Fetch(System.Data.IDataReader data)
        {
            var safeData = new SafeDataReader(data);
            IdAsignacion = safeData.GetInt64("nId_Asignacion");
            IdPrestador = safeData.GetInt64("nId_Prestador");
            Prestador = safeData.GetString("cPrestador");
            IdEncargadoProyecto = safeData.GetInt64("nld_Proyecto_Encargado");
            EncargadoProyecto = safeData.GetString("cProyectoEncargado");
            IdProyecto = safeData.GetInt64("nId_Proyecto");
            IdEstatus = 1;//safeData.GetInt32("nId_Estatus_Asignacion");
            Estatus  = safeData.GetString("cEstatusAsignacion");
            FechaInicioAsignacion = safeData.GetDateTime("dFecha_Inicio_Asignacion");
            FechaFinAsignacion = safeData.GetDateTime("dFecha_Fin_Asignacion");
            HorasPorAplicar = 480;//safeData.GetDouble("nHorasPorAplicar");
            Habilitado = safeData.GetBoolean("bHabilitado");
            FechaAlta = safeData.GetDateTime("dFecha_Alta");
            FechaBaja = safeData.GetDateTime("dFecha_Baja");
            Escuela = safeData.GetString("cEscuela");
            Carrera = safeData.GetString("cCarrera");
            NumCuenta = safeData.GetString("cNumCuenta");
            EstatusPrestador = safeData.GetString("cEstatusPrestador");
            ClaveProyecto = safeData.GetString("cClaveProyecto");
            NombreProyecto = safeData.GetString("cNombreProyecto");
        }

		private void DataPortal_Fetch(AsignacionCriteria criteria)
		{
			using (var dalManager = Sireass.Dal.DalFactory.GetManager())
			{
				var dal = dalManager.GetProvider<Sireass.Dal.IAsignacionDal>();
				using (var data = new Csla.Data.SafeDataReader(dal.Fetch(criteria.IdAsignacion, criteria.IdPrestador, criteria.EncargadoProyecto, criteria.IdEncargadoProyecto,
																			criteria.Prestador, criteria.IdProyecto, criteria.IdEstatus, criteria.FechaInicioAsignacion,
																			criteria.FechaFinAsignacion, criteria.HorasPorAplicar, criteria.Habilitado)))
				{
					if (data.Read())
					{
						IdAsignacion = data.GetInt64("nId_Asignacion");
						IdPrestador = data.GetInt64("nId_Prestador");
						Prestador = data.GetString("cPrestador");
						IdEncargadoProyecto = data.GetInt64("nld_Proyecto_Encargado");
						EncargadoProyecto = data.GetString("cProyectoEncargado");
						IdProyecto = data.GetInt64("nId_Proyecto");
						IdEstatus = data.GetByte("nId_Estatus_Asignacion");
						Estatus = data.GetString("cEstatusAsignacion");
						FechaInicioAsignacion = data.GetDateTime("dFecha_Inicio_Asignacion");
						FechaFinAsignacion = data.GetDateTime("dFecha_Fin_Asignacion");
						HorasPorAplicar = data.GetInt16("nHorasPorAplicar");
						Habilitado = data.GetBoolean("bHabilitado");
						FechaAlta = data.GetDateTime("dFecha_Alta");
						FechaBaja = data.GetDateTime("dFecha_Baja");
					}
				}
			}
		}
        #endregion



    }
}
